package com.kty.methods.xlr.method.xlr;

import com.kty.methods.xlr.dao.XlrOther;
import com.nlf.calendar.Lunar;
import lombok.Data;

import java.util.List;

@Data
public class LiuRen {

    private Lunar lunarDate; // 农历日期
    private String lunarDateStr; // 农历日期String格式
    private String solarDate; // 公历日期

    private int monthNumber; // 月份落(终)点数：又为日辰起点数
    private String monthInfo; // 月份落(终)点信息
    private String monthPosition; // 月份落(终)点位置

    private int dayNumber; // 天数落(终)点数：又为时辰起点数
    private String dayInfo; // 天数落(终)点信息
    private String dayPosition; // 天数落(终)点位置

    private int timeNumber; // 时辰落(终)点数
    private String timeInfo; // 时辰落(终)点信息
    private String timePosition; // 时辰落(终)点位置

    private String zhongGuaInfo; // '终卦'信息解读

    private String spare; // 备用属性

//**********************************************************************************************************************

    XlrOther xlrOther = new XlrOther();

//======================================================================================================================

    /**
     * 获取并设置'公历日期'
     */
    public void solarDate() {

//        Solar solar = LunarDate.getSolar(); // 获取国历年月日
//        int year = LunarDate.getSolar().getYear(); // 获取公历年
        int month = lunarDate.getSolar().getMonth(); // 获取公历月
        int day = lunarDate.getSolar().getDay(); // 获取公历日
        int time = lunarDate.getSolar().getHour(); // 获取时
//        int minute = LunarDate.getSolar().getMinute(); // 获取分
//        int second = LunarDate.getSolar().getSecond(); // 获取秒

        setSolarDate(month + "月" + day + "日" + time + "时");

    }

    /**
     * 获取并设置'农历日期'String格式
     */
    public void lunarDateStr() {

        if(null != getSpare()){
            setLunarDateStr(getLunarDate() + "日(" + getSpare() + ")" + getLunarDate().getTimeZhi() + "时"); // 设置农历日期（附带早晚子时）
        }else {
            setLunarDateStr(getLunarDate() + "日" + getLunarDate().getTimeZhi() + "时"); // 设置农历日期
        }

    }

//----------------------------------------------------------------------------------------------------------------------

    /**
     * 通用：获取月份信息
     *
     * @param month 月份
     * @return 所有信息
     */
    private String[] monthInfo(int month) {

        // 判数字是否为负数
        if (month < 0) {
            // 转为正数
            month = (month + (month * 2));
        }

        List<String> list = xlrOther.getLIU_SHEN_INFO().get(0); // 六神顺序（1~6顺排）【默认从'大安'开始】
        List<String> list1 = xlrOther.getLIU_SHEN_WEI().get(0); // 六神左手顺序（1~6顺排）【默认从'大安'开始】

        int number; // 记录'落点数'
        String info; // 记录'落点信息'
        String position; // 记录'落点位置'
        String[] all = new String[3]; // 记录所有数据

        // ★判断'落点数'和'落点信息'
        // 根据月份数决定循环次数
        int index = -1; // 记录索引位置
        for (int i = 0; i < month; i++) {
            index++;
            if (index > 5) index = 0; // 共6个元素，故需重置索引，否则会索引越界
        }

        info = list.get(index); // 最终落点信息
        position = list1.get(index); //  // 最终落点位置（基于左手手掌）
        number = index; // 最终落点数

        //添加数据
        all[0] = String.valueOf(number);
        all[1] = info;
        all[2] = position;

        return all;

    }

    /**
     * 通用：获取（天数\时间）信息
     *
     * @param dayOrTime        天数 或 时间
     * @param monthOrDayNumber 月份落点数 互 天数落点数
     * @return 所有信息
     */
    private String[] dayOrTimeInfo(int dayOrTime, int monthOrDayNumber) {

        String[] liuShen = xlrOther.getLiuShen(); // 六神顺序（1~6顺排）
        List<String> list = xlrOther.getLIU_SHEN_INFO().get(monthOrDayNumber); // 根据'月份\天数落(终)点数'获取对应顺序
        List<String> list1 = xlrOther.getLIU_SHEN_WEI().get(monthOrDayNumber); // 六神左手顺序（1~6顺排）

        int number; // 记录'落点数'
        String info; // 记录'落点信息'
        String position; // 记录'落点位置'
        String[] all = new String[3]; // 记录所有数据

        // ★判断'落点数'和'落点信息'
        // 根据月份数决定循环次数
        int index = -1; // 记录索引位置
        int j = 0; // 临时记录'落点'代表的数字
        for (int i = 0; i < dayOrTime; i++) {
            index++;
            if (index > 5) index = 0; // 共6个元素，故需重置索引，否则会索引越界
        }

        // 判断'落点'代表的数字
        for (int i = 0; i < liuShen.length; i++) {
            if (list.get(index).equals(liuShen[i])) {
                j = i;
            }
        }
        number = j; // 最终落点数
        info = list.get(index); // 最终落点信息
        position = list1.get(index); //  // 最终落点位置（基于左手手掌）

        //添加数据
        all[0] = String.valueOf(number);
        all[1] = info;
        all[2] = position;

        return all;

    }

//-----------------------------------------------------------

    /**
     * 1、获取并设置月份'落点数'、'落点信息'、'落点位置'
     */
    public void monthInfo() {

        // 设置信息
        String[] info = monthInfo(lunarDate.getMonth());

        // 设置信息
        setMonthNumber(Integer.parseInt(info[0]));
        setMonthInfo(info[1]);
        setMonthPosition(info[2]);

    }

    /**
     * 2、获取并设置天数'落点数'、'落点信息'、'落点位置'
     */
    public void dayInfo() {

        // 获取信息
        String[] info = dayOrTimeInfo(lunarDate.getDay(), getMonthNumber());

        // 设置信息
        setDayNumber(Integer.parseInt(info[0]));
        setDayInfo(info[1]);
        setDayPosition(info[2]);

    }

    /**
     * 3、获取并设置时辰'落点数'、'落点信息'、'落点位置'
     */
    public void timeInfo() {

        // 获取信息
        String[] info = dayOrTimeInfo(xlrOther.getDI_ZHI().get(lunarDate.getTimeZhi()), getDayNumber());

        // 设置信息
        setTimeNumber(Integer.parseInt(info[0]));
        setTimeInfo(info[1]);
        setTimePosition(info[2]);

    }

//======================================================================================================================

    /**
     * 获取并设置'终卦'信息解读
     */
    public void zhongGuaInfo(){
        setZhongGuaInfo(xlrOther.JIE_DU.get(getTimeNumber()));
    }

}
